package Vista;

import java.awt.*;
import java.util.ArrayList;

import javax.swing.*;

import Controlador.*;
import Modelo.*;


@SuppressWarnings("serial")
public class VentanaPrincipal extends JFrame{
	
	private VistaOpciones vistaOpcionesJuego;
	private PanelSuperior estadoJuego;
	private JFrame ventana;
	private Controlador controlador;
	private ArrayList<Casillero> casilleros;
	
	public VentanaPrincipal(){
		
		ventana = new JFrame("AlgoCity");
		ventana.setSize(1000,700);
		ventana.setLayout(new BorderLayout());
		this.casilleros = new ArrayList<Casillero>();
		this.vistaOpcionesJuego = new VistaOpciones(ventana);
		ventana.addWindowListener(new VentanaListener());
	}
	
	public void mostrarVistaInicial (){
		
		
		this.vistaOpcionesJuego.configurarOpciones(this.controlador);
		this.ventana.setVisible(true);
		this.vistaOpcionesJuego.setVisible(true);
		
	}

	public void generarVistaInicial(Juego unJuego){
		
		this.agregarEstadoJuego(unJuego);
		this.ventana.getContentPane().add(this.estadoJuego,BorderLayout.PAGE_START);
		
		JPanel barraIzquierda = new JPanel();
		GridBagLayout unLayout = new GridBagLayout(); 
		barraIzquierda.setLayout(unLayout);
		
		GridBagConstraints ubicacion = new GridBagConstraints();
		JButton botonIndustria = new JButton("Industria");
		this.controlador.agregarAccionIndustria(botonIndustria);
		botonIndustria.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		Dimension dimension = new Dimension(130,26);
		botonIndustria.setPreferredSize(dimension);
		ubicacion.gridx = 0;
		ubicacion.gridy = 0;
		ubicacion.gridwidth = 1;
		ubicacion.gridheight = 1;
		barraIzquierda.add(botonIndustria,ubicacion);
		
		
		JButton botonResidencia = new JButton("Residencia");
		this.controlador.agregarAccionResidencia(botonResidencia);
		botonResidencia.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonResidencia.setPreferredSize(dimension);
		ubicacion.gridy = 1;
		barraIzquierda.add(botonResidencia,ubicacion);
		
		
		JButton botonRuta = new JButton("Ruta");
		this.controlador.agregarAccionRuta(botonRuta);
		botonRuta.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonRuta.setPreferredSize(dimension);
		ubicacion.gridy = 2;
		barraIzquierda.add(botonRuta,ubicacion);
		
		
		JButton botonComercio = new JButton("Comercio");
		this.controlador.agregarAccionComercio(botonComercio);
		botonComercio.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonComercio.setPreferredSize(dimension);
		ubicacion.gridy = 3;
		barraIzquierda.add(botonComercio,ubicacion);
		
		
		JButton botonBomberos = new JButton("Est Bomeros");
		this.controlador.agregarAccionBomberos(botonBomberos);
		botonBomberos.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonBomberos.setPreferredSize(dimension);
		ubicacion.gridy = 4;
		barraIzquierda.add(botonBomberos,ubicacion);
		
		
		JButton botonPozo = new JButton("Pozo de Agua");
		this.controlador.agregarAccionPozoDeAgua(botonPozo);
		botonPozo.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonPozo.setPreferredSize(dimension);
		ubicacion.gridy = 5;
		barraIzquierda.add(botonPozo,ubicacion);
		
		
		
		JButton botonCEolica = new JButton("Central Eolica");
		this.controlador.agregarAccionCEolica(botonCEolica);
		botonCEolica.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonCEolica.setPreferredSize(dimension);
		ubicacion.gridy = 6;
		barraIzquierda.add(botonCEolica,ubicacion);
		
		
		JButton botonCMineral = new JButton("Central Mineral");
		this.controlador.agregarAccionCMineral(botonCMineral);
		botonCMineral.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonCMineral.setPreferredSize(dimension);
		ubicacion.gridy = 7;
		barraIzquierda.add(botonCMineral,ubicacion);
		
		
		
		JButton botonCNuclear = new JButton("Central Nuclear");
		this.controlador.agregarAccionCNuclear(botonCNuclear);
		botonCNuclear.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonCNuclear.setPreferredSize(dimension);
		ubicacion.gridy = 8;
		barraIzquierda.add(botonCNuclear,ubicacion);
		
		
		JButton botonLineaTension = new JButton("Linea de Tension");
		this.controlador.agregarAccionLineaTension(botonLineaTension);
		botonLineaTension.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonLineaTension.setPreferredSize(dimension);
		ubicacion.gridy = 9;
		barraIzquierda.add(botonLineaTension,ubicacion);
		
		
		JButton botonTuberia = new JButton("Tuberia");
		this.controlador.agregarAccionTuberia(botonTuberia);
		botonTuberia.addActionListener(new ActionListenerSeleccionarConstruccion(this.controlador));
		botonTuberia.setPreferredSize(dimension);
		ubicacion.gridy = 10;
		barraIzquierda.add(botonTuberia,ubicacion);
			
		JButton botonFinalizarTurno = new JButton("Finalizar Turno");
		botonFinalizarTurno.addActionListener(new ActionListenerFinTurno(this.controlador));;
		botonFinalizarTurno.setPreferredSize(dimension);
		ubicacion.gridy = 11;
		barraIzquierda.add(botonFinalizarTurno,ubicacion);
		
		
		
		this.ventana.getContentPane().add(barraIzquierda,BorderLayout.LINE_START);
		
		
		int ancho = this.controlador.getJuego().obtenerMapa().obtenerAncho();
		int alto = this.controlador.getJuego().obtenerMapa().obtenerAlto();
		GridLayout grilla = new GridLayout(alto,ancho);
		JPanel mapaCentral = new JPanel();
		mapaCentral.setLayout(grilla);
		for(int i = 0 ; i < alto ; i++){
			for(int j = 0 ; j < ancho ; j++){
				Hectarea referencia = this.controlador.getJuego().obtenerMapa().obtenerHectareaEnPosicion(j, i);
				Casillero casillero = new Casillero(referencia,new VistaTierra());
				this.casilleros.add(casillero);
				casillero.addMouseListener(new MouseListenerCasillero(this.controlador));
				if( !referencia.obtenerSuperficie().puedoConstruirEdificioTerrestre()){
					casillero.setVista(new VistaAgua());
				}
				mapaCentral.add((JButton)casillero);
			}
		}
		this.ventana.getContentPane().add(mapaCentral,BorderLayout.CENTER);
		
		this.ventana.setVisible(true);
	
	
	}

	private void agregarEstadoJuego(Juego unJuego) {
		this.estadoJuego = new PanelSuperior(unJuego);
	}
	
	public void actualizarEstadoJuego(Juego unJuego){
		this.estadoJuego.actualizarInfoJuego(unJuego);
	}

	public void setControlador(Controlador controlador) {
		this.controlador = controlador;
	}
	public void actualizarVistaCasilleros() {
		
		this.actualizarEstadoJuego(this.controlador.getJuego());
		ArrayList<Hectarea> hectareasAfectadas = this.controlador.getJuego().obtenerMapa().obtenerHectareasAfectadas();
		ArrayList<Hectarea> hectareasConConstruccionesDestruidas = this.controlador.getJuego().obtenerMapa().obtenerHectareasConstruccionesDestruidas();
		for(int i=0;i<this.casilleros.size();i++){
		
			Hectarea unaHectarea = this.casilleros.get(i).obtenerHectarea();

			if(hectareasConConstruccionesDestruidas.contains(unaHectarea)){
				this.casilleros.get(i).setVista(new VistaTierra());
			}

			int estadoNuevo = (int)unaHectarea.obtenerSuperficie().obtenerEstadoConstruccion();
			this.casilleros.get(i).setEstado(estadoNuevo);
			boolean tieneLuz = this.controlador.getJuego().obtenerMapa().tieneAccesoALuzLaHectarea(unaHectarea);
			boolean tieneAgua = this.controlador.getJuego().obtenerMapa().tieneAccesoAAgua(unaHectarea);
			if(tieneLuz && tieneAgua){
				this.casilleros.get(i).setIcono("Images//gotaYrayito.jpg");
			}else{
				if(tieneLuz){
					this.casilleros.get(i).setIcono("Images//rayitoMini.jpeg");
				}
				if(tieneAgua){
					this.casilleros.get(i).setIcono("Images//gotaMini.jpg");
					}
				
			}

			if(!tieneLuz && !tieneAgua){
				this.casilleros.get(i).borrarIcono();
			}

			float diferenciaEstado = unaHectarea.obtenerSuperficie().obtenerDiferenciaEstadoConstruccion();
			if(diferenciaEstado>0){
				this.casilleros.get(i).setForeground(Color.MAGENTA);
			}
			if(diferenciaEstado<0){
				this.casilleros.get(i).setForeground(Color.RED);
			}
			if(diferenciaEstado == 0){
				this.casilleros.get(i).setForeground(Color.BLACK);
			}
			
			boolean tieneLineaDeTension = unaHectarea.obtenerSuperficie().tieneLineaDeTension();
			if(hectareasAfectadas.contains(unaHectarea)){
				this.casilleros.get(i).setColorBorde(Color.RED,2);	
			}else{
				if(tieneLineaDeTension){
					this.casilleros.get(i).setColorBorde(Color.ORANGE,3);
				}else{
				this.casilleros.get(i).setBorder((new JButton()).getBorder());			
				}
			}

			
		}
		
		
	}

	public void ocultarVistas() {
		this.vistaOpcionesJuego.setVisible(false);
		this.ventana.setVisible(false);
		
	}

	public VistaOpciones obtenerVistaOpciones() {
		
		return this.vistaOpcionesJuego;
	}

	public Component obtenerVentana() {
		return this.ventana;
	}

	public String elegirImagenCatastrofe(
			CatastrofeIdentificador identificadorCatastrofe) {
		String rutaImagen="";
		
		if(identificadorCatastrofe == CatastrofeIdentificador.TERREMOTO){
			rutaImagen = "Images//terremoto.jpg";
		}
		
		if(identificadorCatastrofe == CatastrofeIdentificador.GODZILLA){
			rutaImagen = "Images//godzilla.jpg";
		}
		
		
		return rutaImagen;
	}


}
